package com.compose.universally.okhttp

import android.text.TextUtils
import com.blankj.utilcode.util.GsonUtils
import com.google.gson.reflect.TypeToken

import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type
import java.util.*


object GsonUtil {

    fun toJson(obj: Any?): String {
        return if (obj == null) {
            ""
        } else try {
            GsonUtils.getGson().toJson(obj)
        } catch (e: Exception) {
            ""
        }
    }

    /**
     * 解析为一个具体的对象
     *
     * @param json 要解析的字符串
     * @param obj  要解析的对象
     * @param <T>  将json字符串解析成obj类型的对象
     * @return
    </T> */
    fun <T> fromJson(json: String?, obj: Class<T>?): T? {
        // 如果为null直接返回为null
        return if (obj == null || TextUtils.isEmpty(json)) {
            null
        } else try {
            GsonUtils.getGson().fromJson(json, obj)
        } catch (e: Exception) {
            null
        }
    }

    /**
     * @return 不区分类型 传什么解析什么
     */
    fun <T> fromJson(json: String?, type: Type?): T? {
        var t: T? = null
        try {
            t = GsonUtils.getGson().fromJson(json, type)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return t
    }

    /**
     * 将Json数组解析成相应的映射对象列表
     * 解决类型擦除的问题
     */
    fun <T> toList(json: String?, clz: Class<T>): List<T> {
        return GsonUtils.getGson().fromJson(json, PType(clz))
    }

    fun <T> toMap(json: String?, clz: Class<T>): Map<String?, T> {
        return GsonUtils.getGson().fromJson(json, PType(clz))
    }

    fun toMap(json: String?): Map<Any, Any> {
        return GsonUtils.getGson().fromJson(json, object : TypeToken<Map<Any, Any>?>() {}.type)
    }

    private class PType(private val type: Type) : ParameterizedType {
        override fun getActualTypeArguments(): Array<Type> {
            return arrayOf(type)
        }

        override fun getRawType(): Type {
            return ArrayList::class.java
        }

        override fun getOwnerType(): Type? {
            return null
        }
    }

}